2014-12-12 2 views
1

У меня есть файл, где каждая строка представляет собой вершину. (Формат ПРИМЕР- 1,0 0,0 Vertice A) Моя задача состоит в том, чтобы создать методуЧтение данных из файла с использованием Java

public void read(InputStream is) throws IOException 

что позволит сэкономить X и Y значения вершин, а затем метку из него «Vertice А». Я понятия не имею, как разобрать его правильно:

public void read(InputStream is) throws IOException { 

     try { 
      Reader r = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(r); 
      while(br.readLine()!=null){ 
       //something 
      } 

     } catch(IOException ex){ 
       ex.printStackTrace(); 
      } 
    } 

также мне нужно метод создания

public void read(File file) throws IOException 

, который делает точно то же самое, но с файлом вместо потока. Можете ли вы сказать мне разницу между этими двумя методами?

ответ

0

Я хотел бы сделать следующее и объяснить это через код :)

public void read(InputStream is) throws IOException { 
    //You create a reader hold the input stream (sequence of data) 
    //You create a BufferedReader which will wrap the input stream and give you methods to read your information 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    handleVerticeValues(reader); 
    reader.close(); 
} 

public void read(File file) throws IOException { 
    //You create a buffered reader to manipulate the data obtained from the file representation 
    BufferedReader reader = new BufferedReader(new FileReader(file)); 
    handleVerticeValues(reader); 
    reader.close(); 
} 

private void handleVerticeValues(BufferedReader reader) throws IOException { 
    //Then you can read your file like this: 
    String lineCursor = null;//Will hold the value of the line being read 

    //Assuming your line has this format: 1.0 0.0 verticeA 
    //Your separator between values is a whitespace character  
    while ((lineCursor = reader.readLine()) != null) { 
     String[] lineElements = lineCursor.split(" ");//I use split and indicates that we will separate each element of your line based on a whitespace 
     double valX = Double.parseDouble(lineElements[0]);//You get the first element before an whitespace: 1.0 
     double valY = Double.parseDouble(lineElements[1]);//You get the second element before and after an whitespace: 0.0 
     String label = lineElements[2];//You get the third element after the last whitespace 
     //You do something with your data 
    } 
} 

Вы можете избежать использования раскола с помощью StringTokenizer, а также, что другой подход :).

Как уже упоминалось в другом ответе, файл представляет собой только представление узла в вашей файловой системе, он просто указывает на элемент, существующий в вашей файловой системе, но не содержит никаких данных или информации в этой точке вашего внутреннего файл, я имею в виду, просто информация в виде файла (если это файл, каталог или что-то в этом роде) (если он не существует, вы получаете исключение FileNotFoundException).

InputStream - это последовательность данных, на данном этапе у вас должна быть информация, которую нужно обрабатывать или читать с помощью BufferedReader, ObjectInputStream или другого компонента, в зависимости от того, что вам нужно делать.

Для получения дополнительной информации, вы также можете обратиться к Вашему дружественным документам API:

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

https://docs.oracle.com/javase/7/docs/api/java/io/File.html

С уважением и ... счастливым кодированием :)

2

Файл представляет собой узел в файловой системе, поток представляет собой представление последовательности данных с считывающей головкой. Открытие файла для чтения результатов во входном потоке. System.In - пример входного потока, для которого вы не предоставили файл, это поток для stdin.

public void read(File file) throws IOException 
{ 
//using your input stream method, read the passed file 
//Create an input stream from the given file, and then call what you've already implemented. 
read(new FileInputStream(file)); 
//I assume your read function closes the stream when it's done 
} 
+0

Было бы хорошо, если бы вы закройте поток после операции чтения. –