문제

나는 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());
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top