hasNext()返回false,即使该文件不为空

时间:2018-01-01 00:42:13

标签: java java.util.scanner

我正在尝试阅读一些.txt个文件,但hasNext()始终会返回false

for(int i = 1; i <= 126; i++)
{
            StringBuilder currentSong = new StringBuilder();
            try 
            {
                String name = i + ".txt";
                File file = new File(name);
                if(file.exists())
                {
                    Scanner input = new Scanner(file);


                    while(input.hasNext())                         //this gets skipped
                    {
                        currentSong.append(input.nextLine());
                    }

                    if(!input.hasNext())                          //this executes
                    {
                        Desktop d = Desktop.getDesktop();
                        d.open(file);
                    }


                    PrintWriter write = new PrintWriter("new/" +  i + ".txt");
                    write.write(currentSong.toString());
                    write.close();
                    input.close();
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "No file was found");
                }


            } 

            catch (FileNotFoundException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

当程序打开文件时,它不是空的,并且有文本,但是当我运行时,它hasNext()返回false ...

这是第一个文件的内容,其余的遵循类似的模板。这些是俄罗斯歌曲:

1
Ты искупил мир от греха,
И дал ему любовь и свет
Зажёг потухшие сердца
и дал надежду.
Мы пред Тобою предстоим
и каждый дорог для Тебя,
За все, Отец, благодарим
и превозносим.

/bПрипев:
/bСлава Тебе и величье,
/bСлава в веках и народах,
/bСила твоя безгранична,
/bМилость Твоя во все роды.

Ты открываешь новый мир
любви, надежды и красоты.
С Тобой не трудно мне идти –
ведь Ты со мною.
Мы пред Тобою предстоим
и каждый дорог для Тебя,
За все, Отец, благодарим
и превозносим.

/bПрипев:
/bСлава Тебе и величье,
/bСлава в веках и народах,
/bСила твоя безгранична,
/bМилость Твоя во все роды.

2 个答案:

答案 0 :(得分:1)

有时候,通用字母(UTF-8)字符集不适合Cyrillic类型字母表,因此要么utf-8忽略字符,要么从源代码中获得其他类型的不同字符。

在您的情况下,您正在按Russian阅读google.translate.com auto detect,我已经测试了10多种语言的源代码并收到类似于输入文件的输出,

eclipse控制台中的

只显示?,因为据我所知它支持普通english charset,甚至utf-8也不支持,

将input.txt放在src目录中 -

1   Russian
Ты искупил мир от греха,
И дал ему любовь и свет
Зажёг потухшие сердца
и дал надежду.
Мы пред Тобою предстоим
и каждый дорог для Тебя,
За все, Отец, благодарим
и превозносим.

2   English
Jack and Jill
Went up the hill
To fetch a pail of water
Jack fell down
And broke his crown,
And Jill came tumbling after
Up Jack got,
And home did trot
As fast as he could caper;
To old Dame Dob,
Who patched his nob
With vinegar and brown paper.

3   Chinese
钱唐湖春行

孤山寺北贾亭西
水面初平云脚低
几处早莺争暖树
谁家新燕啄春泥
乱花渐欲迷人眼
浅草才能没马蹄
最爱湖东行不足
绿杨阴里白沙堤

4   Urdu
کبھی تم مجھ سے ملتے ہو
توڑنا مت کرو،

زندگی آپ کے ساتھ جاتا ہے،
مسکر اندر ہے ...

ایم .سرپر میرپوری

5   Hindi
पुष्प की अभिलाषा
- माखनलाल चतुर्वेदी
चाह नहीं मैं सुरबाला के
गहनों में गूँथा जाऊँ
चाह नहीं, प्रेमी-माला में
बिंध प्यारी को ललचाऊँ
चाह नहीं, सम्राटों के शव
पर हे हरि, डाला जाऊँ
चाह नहीं, देवों के सिर पर
चढ़ूँ भाग्य पर इठलाऊँ
मुझे तोड़ लेना वनमाली
उस पथ पर देना तुम फेंक
मातृभूमि पर शीश चढ़ाने
जिस पर जावें वीर अनेक ।।

6   Korean
초겨울 편지/ 김용택

앞산에
고운 잎
다 졌답니다
빈 산을 그리며
저 강에
흰눈
내리겠지요
눈 내리기 전에
한번 보고 싶습니다

7   Tamil
புத்தாண்டு வாழ்த்துக்கள்
பூக்கட்டும் புதுமலர்,
வீசட்டும் நம்மில்!!
இனிக்கட்டும் திருநாள்,
பிறக்கட்டும் புதுசிந்தனை!!
போகட்டும் பகைமை,
இனையட்டும் உறவு!!
விலகட்டும் தாழ்வு,
வாழட்டும் மனிதம்!!
தோன்றட்டும் வாய்ப்பு,
அடையட்டும் இலக்கு!!
பரவட்டும் அமைதி,
மாறட்டும் புதிய புத்தாண்டு!!

8   Marathi
चल माणसा भाकीत कर
मन तुझं उघड कर
जगण्याचा प्रवाह शिथिल कर
सुकर कर सुजय कर

9   Bengali
ঘোর কেটে গেলে
- আবিদ আনোয়ার
হয়তো এখনও আছি অর্ধস্ফুট গোলাপের মতো-- 
বোঝেনি শরীর-সত্তা কাকে বলে পূর্ণ জাগরণ;
দরিদ্র ইন্দ্রিয়গুলো চিনেছে যে বস্তুবাস্তবতা
কখনও জাগ্রত হলে চিনে নিতো আরেক জীবন। 
যদি এ-রহস্যমালা কোনোদিন এই গূঢ় অন্তর্বাস খোলে
হয়তো দেখবো কিছু বর্গক্ষেত্র ঢুকে বসে আছে
অসংগত পৃথিবীর বেমক্কা বর্তুলে:
প্রকৃত রাজার কাঁধে গোলামের তকমা তুলে দিয়ে
গোলাম রাজত্ব করে জগদ্দল প্রভুত্বের পতাকা উড়িয়ে।
দিব্যদৃষ্টি খুলে গেলে তুমি দেখে নিয়ো

10  German
Der Weg nicht genommen:

Zwei Straßen wichen in gelbem Holz aus,
Und tut mir leid, ich konnte nicht beide reisen
Und sei ein Reisender, lange habe ich gestanden
Und schaute so weit ich konnte nach unten
Zu wo es sich im Unterholz verbog;

11  Punjabi
ਲੋਹੜੀ ਦੇ ਗੀਤ

ਸੁੰਦਰ ਮੁੰਦਰੀਏ - ਹੋ
ਸੁੰਦਰ ਮੁੰਦਰੀਏ - ਹੋ!
ਤੇਰਾ ਕੌਣ ਵਿਚਾਰਾ - ਹੋ!
ਦੁੱਲਾ ਭੱਟੀ ਵਾਲਾ - ਹੋ!
ਦੁੱਲੇ ਧੀ ਵਿਆਹੀ - ਹੋ!
ਸੇਰ ਸੱਕਰ ਆਈ - ਹੋ!
ਕੁੜੀ ਦੇ ਬੋਝੇ ਪਾਈ - ਹੋ!
ਕੁੜੀ ਦਾ ਲਾਲ ਪਟਾਕਾ - ਹੋ!
ਕੁੜੀ ਦਾ ਸਾਲੂ ਪਾਟਾ - ਹੋ!
ਸਾਲੂ ਕੌਣ ਸਮੇਟੇ - ਹੋ!
ਚਾਚਾ ਗਾਲ੍ਹੀ ਦੇਸੇ - ਹੋ!
ਚਾਚੇ ਚੂਰੀ ਕੁੱਟੀ - ਹੋ!
ਜ਼ਿੰਮੀਦਾਰਾਂ ਲੁੱਟੀ - ਹੋ!
ਜ਼ਿੰਮੀਦਾਰ ਸਦਾਓ - ਹੋ!
ਗਿਣ ਗਿਣ ਪੌਲੇ ਲਾਓ - ਹੋ!
ਇੱਕ ਪੌਲਾ ਘਟ ਗਿਆ!
ਜ਼ਿਮੀਂਦਾਰ ਨੱਸ ਗਿਆ - ਹੋ!

我使用Cyrillic (ISO) - charset=iso-8859-5进行阅读和写作,所以这是我的源代码 -

package com.practice;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class ReadFile {
    public static void main(String[] args) {
        try {
            File inputFile = new File("src/Input.txt");
            File outputFile = new File("src/Output.txt");

            BufferedReader reader = new BufferedReader(new InputStreamReader
                            (new FileInputStream(inputFile), "iso-8859-5"));

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter
                            (new FileOutputStream(outputFile), "iso-8859-5"));

            String line = null;
            while((line = reader.readLine()) != null) {
                System.out.println(line);
                writer.write(line + "\n");
            }

            writer.flush();
            writer.close();
            reader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

请不要虐待我,如果你没有找到某种特定语言的例子,那只是为了测试和帮助目的,

答案 1 :(得分:0)

很难准确理解你要做的是什么,但我想你有一些文本文件,而你却无法从同一个文本文件中读取行。它看起来好像您正在尝试将此原始文本文件重新写入新文件。如果是这种情况,我建议将代码分解为更易于管理和测试友好的部分。例如,首先检查以确保正确读取文本文件,方法是将其打印到控制台日志:

import java.util.*;
import java.io.*;

//reads each line from a .txt file and prints to console log
//using hasNext() as condition to while statement (while hasNext() is still true)

public class exampleScannerHasNext
{//end class
   public static void main(String[] args) throws FileNotFoundException
   {//start main

   String eachLineRead;
   File file = new File("johnLennon.txt");
   Scanner inputFile = new Scanner(file);

   while(inputFile.hasNext())
   {    
      eachLineRead = inputFile.nextLine();
      System.out.println(eachLineRead);
   }
   inputFile.close();
   }//end main
}//endclass

我正在使用这个名为&#34; johnLennon.txt&#34;的文本文件。 :

Imagine there's no heaven
It's easy if you try
No hell below us
Above us only sky
Imagine all the people
Living for today... Aha-ah...

Imagine there's no countries
It isn't hard to do
Nothing to kill or die for
And no religion, too
Imagine all the people
Living life in peace... You...

You may say I'm a dreamer
But I'm not the only one
I hope someday you'll join us
And the world will be as one

Imagine no possessions
I wonder if you can
No need for greed or hunger
A brotherhood of man
Imagine all the people
Sharing all the world... You...

然后,一旦你向自己证明了问题不在于hasNext(),那么你可以开始向代码中添加更多功能,例如try catch语句,如果文件存在与否,甚至是字符串到新文件。我很乐意进一步详细说明代码的扩展。请告诉我,我们可以一起编写方法。 -James