2010-09-27 18 views

Odpowiedz

46

plik Read, analizować każdą linię do liczby całkowitej i zapisać na listę:

List<Integer> list = new ArrayList<Integer>(); 
File file = new File("file.txt"); 
BufferedReader reader = null; 

try { 
    reader = new BufferedReader(new FileReader(file)); 
    String text = null; 

    while ((text = reader.readLine()) != null) { 
     list.add(Integer.parseInt(text)); 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (reader != null) { 
      reader.close(); 
     } 
    } catch (IOException e) { 
    } 
} 

//print out the list 
System.out.println(list); 
+0

To jest dobre, ale chciałbym użyć 'Integer.valueOf (String) 'zamiast tego, ponieważ i tak chcesz obiekt (Integer). –

+0

Dlaczego nie możemy przenieść ** reader.close(); ** do linii tuż po pętli while i uniknąć całego ** finally ** bloku i innego ** try-catch ** zablokować ** wreszcie ** zawiera? –

+2

@ m-d Zobacz [Samouczek Javy] (http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html). Powinieneś zamknąć zasoby w 'finally', aby upewnić się, że są zawsze zamknięte, nawet jeśli wystąpi wyjątek w bloku' try'. Zapobiega to wyciekom zasobów. – dogbane

3
try{ 

    BufferedReader br = new BufferedReader(new FileReader("textfile.txt")); 
    String strLine; 
    //Read File Line By Line 
    while ((strLine = br.readLine()) != null) { 
     // Print the content on the console 
     System.out.println (strLine); 
    } 
    //Close the input stream 
    in.close(); 
    }catch (Exception e){//Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
    }finally{ 
    in.close(); 
    } 

będzie to czytać wiersz po wierszu,

Jeśli urządzenie nie. są saperowane przez newline char. następnie w miejscu

System.out.println (strLine); 

Można mieć

try{ 
int i = Integer.parseInt(strLine); 
}catch(NumberFormatException npe){ 
//do something 
} 

Jeśli jest oddzielone spacjami następnie

try{ 
    String noInStringArr[] = strLine.split(" "); 
//then you can parse it to Int as above 
    }catch(NumberFormatException npe){ 
    //do something 
    } 
+0

należy zamknąć InputStream w 'finally' bloku. – dogbane

+0

Proszę nie używać DataInputStream do czytania tekstu. Niestety, takie przykłady są ciągle kopiowane, więc możesz je usunąć ze swojego przykładu. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

+1

zaktualizowany, fajny artykuł btw –

9

A dużo s horter alternatywą jest poniżej:

Path filePath = Paths.get("file.txt"); 
Scanner scanner = new Scanner(filePath); 
List<Integer> integers = new ArrayList<>(); 
while (scanner.hasNext()) { 
    if (scanner.hasNextInt()) { 
     integers.add(scanner.nextInt()); 
    } else { 
     scanner.next(); 
    } 
} 

A Scanner łamie swoje wejście na tokeny z wykorzystaniem wzorca separatora, który domyślnie odpowiada spacji. Chociaż domyślnym ogranicznikiem jest biały znak, to udało się znaleźć wszystkie liczby całkowite oddzielone znakiem nowego wiersza.

3

Dobre wieści w Java 8 możemy zrobić to w jednym wierszu:

List<Integer> ints = Files.lines(Paths.get(fileName)) 
          .map(Integer::parseInt) 
          .collect(Collectors.toList()); 
1
File file = new File("file.txt"); 
Scanner scanner = new Scanner(file); 
List<Integer> integers = new ArrayList<>(); 
while (scanner.hasNext()) { 
    if (scanner.hasNextInt()) { 
     integers.add(scanner.nextInt()); 
    } 
    else { 
     scanner.next(); 
    } 
} 
System.out.println(integers); 
+0

Podoba mi się Twoja odpowiedź! Sposób, w jaki wypisuje tylko liczby całkowite i pomija spacje, nowe linie i inne niecałkowate znaki – Hazmat

Powiązane problemy