Java에서 입력 문자 별 문자 별 문자를 어떻게 읽습니까?
문제
나는 C 스타일에 익숙합니다 getchar()
, 그러나 Java와 비슷한 것이없는 것 같습니다. 어휘 분석기를 만들고 있으며 입력 문자를 문자별로 읽어야합니다.
나는 스캐너를 사용하여 토큰 또는 선으로 스캔하고 토큰 숯 바로 숯을 통해 구문 분석 할 수 있지만, 여러 줄에 걸쳐있는 문자열에는 다루기 어려운 것 같습니다. Java의 입력 버퍼에서 다음 문자를 얻을 수있는 방법이 있습니까? 아니면 스캐너 클래스에 연결해야합니까?
입력은 키보드가 아닌 파일입니다.
해결책
사용 reader.read (). -1의 반환 값은 스트림 끝을 의미합니다. 그렇지 않으면 캐스트 숯.
이 코드는 파일 인수 목록에서 문자 데이터를 읽습니다.
public class CharacterHandler {
//Java 7 source level
public static void main(String[] args) throws IOException {
// replace this with a known encoding if possible
Charset encoding = Charset.defaultCharset();
for (String filename : args) {
File file = new File(filename);
handleFile(file, encoding);
}
}
private static void handleFile(File file, Charset encoding)
throws IOException {
try (InputStream in = new FileInputStream(file);
Reader reader = new InputStreamReader(in, encoding);
// buffer for efficiency
Reader buffer = new BufferedReader(reader)) {
handleCharacters(buffer);
}
}
private static void handleCharacters(Reader reader)
throws IOException {
int r;
while ((r = reader.read()) != -1) {
char ch = (char) r;
System.out.println("Do something with " + ch);
}
}
}
위 코드의 나쁜 점은 시스템의 기본 문자 세트를 사용한다는 것입니다. 가능하면 알려진 인코딩을 선호하십시오 (선택이있는 경우 유니 코드 인코딩). 참조 숯불 더 많은 수업. (마조히즘을 느끼면 읽을 수 있습니다 문자 인코딩에 대한이 안내서.)
(당신이 찾고 싶은 한 가지는 보충 유니 코드 문자입니다. 성격 자세한 내용은 클래스; 이것은 아마도 숙제에 적용되지 않는 엣지 케이스입니다.)
다른 팁
문자 인코딩 및 입력 버퍼링을 지정하기 위해 다른 사람의 권장 사항을 결합하여 여기에 매우 완전한 대답이 있다고 생각합니다.
당신이 있다고 가정합니다 File
읽을 파일을 나타내는 개체 :
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(file),
Charset.forName("UTF-8")));
int c;
while((c = reader.read()) != -1) {
char character = (char) c;
// Do something with your character
}
또 다른 옵션은 문자별로 문자를 읽지 않는 것입니다. 전체 파일을 메모리로 읽으십시오. 캐릭터를 두 번 이상보아야하는 경우 유용합니다. 그렇게하는 하나의 사소한 방법은 다음과 같습니다.
/** Read the contents of a file into a string buffer */
public static void readFile(File file, StringBuffer buf)
throws IOException
{
FileReader fr = null;
try {
fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
char[] cbuf = new char[(int) file.length()];
br.read(cbuf);
buf.append(cbuf);
br.close();
}
finally {
if (fr != null) {
fr.close();
}
}
}
버퍼링 된 리더에 입력 스트림을 감싸고 읽기 메소드를 사용하여 스트림 끝까지 한 번에 하나의 바이트를 읽습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Reader {
public static void main(String[] args) throws IOException {
BufferedReader buffer = new BufferedReader(
new InputStreamReader(System.in));
int c = 0;
while((c = buffer.read()) != -1) {
char character = (char) c;
System.out.println(character);
}
}
}
내가 당신이라면 스캐너를 사용하고 ".nextByte ()"를 사용합니다. 당신은 그것을 숯으로 캐스팅 할 수 있고 당신은 좋습니다.
사용하는 경우 몇 가지 옵션이 있습니다 BufferedReader
. 이 버퍼링 된 독자는 독자보다 빠르므로 포장 할 수 있습니다.
BufferedReader reader = new BufferedReader(new FileReader(path));
reader.read(char[] buffer);
이것은 선을 char 배열로 읽습니다. 비슷한 옵션이 있습니다. 문서를보십시오.
독자를 랩핑하십시오 버퍼링 리더, 버퍼를 유지하여 전체적으로 훨씬 빠른 읽기를 허용합니다. 그런 다음 read ()를 사용하여 단일 문자를 읽을 수 있습니다 (캐스트해야 할 필요). 또한 readline ()을 사용하여 전체 줄을 가져온 다음 개별 문자로 나눌 수도 있습니다. BufferedReader는 또한 마킹 및 반환을 지원하므로 필요한 경우 여러 번 줄을 읽을 수 있습니다.
일반적으로 말하면, 당신은 그들이 유지 관리하는 버퍼가 여러 판독을 훨씬 더 빨리 만들어주기 때문에 실제로 사용하는 스트림 위에 버퍼링 리더 또는 BufferedInputStream을 사용하려고합니다.
Java 5에서는 Java의 문자별로 입력 문자를 읽을 수있는 스캐너 메소드 인 새로운 기능이 추가되었습니다.
예를 들어; 사용 스캐너 메소드의 경우 import java.util.scanner; 주요 방법에서 : 정의
스캐너 MyScanner = 새로운 스캐너 (System.In); // 읽기 문자
char ally = myscanner.findinline ( "."). charat (0);
당신은 더 많은 문자를 원한다면 더 많은 캐릭터를 더 많이 읽으려면 무엇이든 뭐든지 뭐든지 더 많은 객체를 선언합니다.
import java.util.Scanner;
class ReverseWord {
public static void main(String args[]){
Scanner myScanner=new Scanner(System.in);
char c1,c2,c3,c4;
c1 = myScanner.findInLine(".").charAt(0);
c2 = myScanner.findInLine(".").charAt(0);
c3 = myScanner.findInLine(".").charAt(0);
c4 = myScanner.findInLine(".").charAt(0);
System.out.print(c4);
System.out.print(c3);
System.out.print(c2);
System.out.print(c1);
System.out.println();
}
}
파일에서 한 줄 당 1 문자를 인쇄합니다.
try {
FileInputStream inputStream = new FileInputStream(theFile);
while (inputStream.available() > 0) {
inputData = inputStream.read();
System.out.println((char) inputData);
}
inputStream.close();
} catch (IOException ioe) {
System.out.println("Trouble reading from the file: " + ioe.getMessage());
}