سؤال

أنا معتاد على أسلوب C getchar(), ، ولكن يبدو أنه لا يوجد شيء مشابه لـ java.أنا أقوم ببناء محلل معجمي، وأحتاج إلى قراءة حرف الإدخال بحرف.

أعلم أنه يمكنني استخدام الماسح الضوئي لمسح رمز مميز أو سطر وتحليله من خلال الرمز المميز char-by-char، ولكن هذا يبدو غير عملي بالنسبة للسلاسل الممتدة على عدة أسطر.هل هناك طريقة للحصول على الحرف التالي من المخزن المؤقت للإدخال في Java، أم يجب عليّ فقط توصيله بفئة Scanner؟

الإدخال هو ملف، وليس لوحة المفاتيح.

هل كانت مفيدة؟

المحلول

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);
        }
    }
}

وهذا شيئا سيئا عن رمز أعلاه هو أنه يستخدم مجموعة الأحرف الافتراضية للنظام. حيثما كان ذلك ممكنا، ويفضل الترميز المعروفة (من الناحية المثالية، ترميز Unicode إذا كان لديك خيار). ترى فئة محارف للحصول على أكثر من ذلك. (إذا كنت تشعر ماسوشي، يمكنك أن تقرأ <لأ href = "http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html" يختلط = "noreferrer" > هذا الدليل لترميز الأحرف .)

(شيء واحد كنت قد ترغب في النظر عنها هي أحرف Unicode التكميلية - تلك التي تتطلب قيمتين شار إلى مخزن انظر في الطبقة الأحرف للحصول على مزيد من التفاصيل؛ وهذا هو الحال الحافة التي ربما لن تنطبق على الواجبات المنزلية)

نصائح أخرى

والجمع بين توصيات من الآخرين لتحديد ترميز الأحرف والتخزين المؤقت المدخلات، وهنا ما أعتقد أنه إجابة كاملة إلى حد ما.

وعلى افتراض لديك كائن 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);

وهذا يقرأ الخط إلى صفيف حرف. لديك خيارات مماثلة. انظر في الوثائق.

تمت إضافة ميزة جديدة في Java 5 وهي طريقة الماسح الضوئي التي تتيح الفرصة لقراءة حرف الإدخال بحرف في Java.

على سبيل المثال؛لاستخدام طريقة الماسح الضوئي، قم باستيراد java.util.Scanner؛بعد في الطريقة الرئيسية: تحديد

Scanner myScanner = new Scanner(System.in);// لقراءة الحرف

char أي شيء=myScanner.findInLine(".").charAt(0);

يمكنك تخزين أي شيء بحرف واحد، إذا كنت تريد المزيد اقرأ المزيد من الأحرف أعلن عن المزيد من الكائنات مثل أي شيء 1، أي شيء 2 ...مزيد من الأمثلة لإجابتك يرجى التحقق من يدك (نسخ / لصق)

     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());
    }
scroll top