2011-11-30 6 views
16

Tôi đang viết một chương trình bằng Java và một trong những điều tôi cần làm là tạo một tập hợp mọi vị trí hợp lệ cho một vấn đề đường đi ngắn nhất. Các vị trí được định nghĩa trong tệp .txt theo một mẫu nghiêm ngặt (một mục trên mỗi dòng, không có khoảng trống thừa) và hoàn hảo để sử dụng .nextLine để lấy dữ liệu. Vấn đề của tôi là 241 dòng vào tệp (trong số 432) máy quét ngừng hoạt động 3/4 theo cách thông qua mục nhập và không nhận ra bất kỳ dòng mới nào.Máy quét Java không duyệt toàn bộ tập tin

Mã của tôi:

//initialize state space 
private static Set<String> posible(String posLoc) throws FileNotFoundException { 
    Scanner s = new Scanner(new File(posLoc)); 
    Set<String> result = new TreeSet<String>(); 
    String availalbe; 
    while(s.hasNextLine()) { 
     availalbe = s.nextLine(); 
     result.add(availalbe); 
    } 
    s.close(); 
    return result; 
} 

Data

Shenlong Gundam 
Altron Gundam 
Tallgee[scanner stops reading here]se 
Tallgeese II 
Leo (Ground) 
Leo (Space) 

Tất nhiên, "máy quét ngừng đọc ở đây" không có trong dữ liệu, tôi chỉ đánh dấu nơi quét dừng đọc các tập tin. Đây là 3068 byte vào tệp, nhưng điều đó không ảnh hưởng đến bất cứ điều gì vì trong cùng một chương trình, với mã gần như giống hệt nhau, tôi đang đọc một tệp 261tB, 14KB .txt mã hóa các đường dẫn. Bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn bạn.

+1

Bạn có thể tải lên tệp dữ liệu thực tế ở đâu đó nơi chúng tôi có thể xem không? – NPE

+1

Có ngoại lệ nào không? Có bất kỳ khối bắt trống nào không? –

+0

Tôi hy vọng pastebin hoạt động cho tất cả mọi người. [dữ liệu] (http://pastebin.com/rt3mbXtD) – Fizzmaister

Trả lời

15

Đã xảy ra sự cố với Máy quét đọc tệp của bạn nhưng tôi không chắc nó là gì. Nó nhầm lẫn tin rằng nó đã đến cuối tập tin khi nó không, có thể do một số mã hóa String sôi nổi. Hãy thử sử dụng một đối tượng BufferedReader bao bọc một đối tượng FileReader thay thế.

ví dụ:

private static Set<String> posible2(String posLoc) { 
     Set<String> result = new TreeSet<String>(); 
     BufferedReader br = null; 
     try { 
     br = new BufferedReader(new FileReader(new File(posLoc))); 
     String availalbe; 
     while((availalbe = br.readLine()) != null) { 
      result.add(availalbe);    
     } 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     } 
     return result; 
    } 

Sửa
tôi đã cố gắng làm giảm vấn đề của bạn để tối thiểu của nó, và chỉ cần điều này là đủ để gợi ra những vấn đề:

public static void main(String[] args) { 
     try { 
     Scanner scanner = new Scanner(new File(FILE_POS)); 
     int count = 0; 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      System.out.printf("%3d: %s %n", count, line); 
      count++; 
     } 

Tôi đã kiểm tra các đối tượng Scanner với printf:

System.out.printf("Str: %-35s size%5d; Has next line? %b%n", availalbe, result.size(), s.hasNextLine()); 

và cho thấy rằng nó cho rằng tệp đã kết thúc. Tôi đang trong quá trình xóa dần các dòng từ dữ liệu sang tệp để xem (các) dòng nào gây ra sự cố, nhưng sẽ để lại điều đó cho bạn.

+0

Cảm ơn, nó đã hoạt động. Tôi không biết có gì sai với máy quét, nhưng nó đọc mọi thứ. – Fizzmaister

+0

@Fizzmaister: vui lòng xem chỉnh sửa. –

+3

Và vì vậy chúng tôi sẽ không bao giờ biết. :/ – Bryan

4

Tôi đã gặp sự cố tương tự. Các máy quét sẽ không đọc vào cuối của một tập tin, thực sự dừng lại ngay giữa một từ. Tôi nghĩ rằng đó là một vấn đề với một số giới hạn đặt trên máy quét, nhưng tôi đã lưu ý của các bình luận từ rfeak về mã hóa ký tự.

Tôi đã lưu lại .txt Tôi đã đọc vào UTF-8, nó đã giải quyết được sự cố. Nó chỉ ra rằng Notepad đã mặc định để ANSI.

-1

Bạn nên sử dụng điều này:

Máy quét quét = new Máy ​​quét (fileObj) .useDelimiter ("\ z");
System.out.println (scanner.next());

+1

Điều này thậm chí không biên dịch, và nếu bạn sửa chữa nó để biên dịch, nó không đến gần để giải quyết vấn đề này. – wvdz

6

tôi gặp phải vấn đề tương tự và đây là những gì tôi đã làm để sửa chữa nó:

1.Saved the file I was reading from into UTF-8 
2.Created new Scanner like below, specifying the encoding type: 


    Scanner scanner = new Scanner(new File("C:/IDSBRIEF/GuidData/"+sFileName),"UTF-8"); 
+0

Điều này giải quyết được vấn đề của tôi. Về cơ bản, máy quét của tôi giả định một mã hóa, trong khi Notepad ++ lại giả định một mã khác. Khi tôi chỉ định cùng một mã hóa ở cả hai nơi, vấn đề của tôi đã được giải quyết. –

+0

Phần này đã giải quyết được vấn đề của tôi:), "UTF-8"); Cảm ơn! –

0

Tôi đã có một tập tin txt trong đó Scanner ngừng đọc tại dòng 862, đó là một vấn đề lạ. Những gì tôi đã làm là tạo ra một tập tin khác nhau (để cố gắng nhân rộng vấn đề). Tôi thêm nó ít hơn 862 dòng đầu tiên, sau đó tôi đã thêm hơn 862 và nó hoạt động tốt.Vì vậy, tôi tin rằng vấn đề là trên tập tin trước của tôi, tại dòng 862, có điều gì đó sai, giống như một số ký tự hoặc biểu tượng có thể đã làm sai lệch Máy quét để đọc xong sớm.

Kết luận: dựa trên kinh nghiệm này, tôi khuyên bạn nên tìm ra dòng chính xác nơi máy quét dừng đọc để tìm giải pháp cho loại sự cố.