【问题标题】:Read from file on JButton click点击 JButton 从文件中读取
【发布时间】:2013-05-18 01:12:59
【问题描述】:

我的 java 项目有问题。我通过搜索和阅读完成了作业,但似乎找不到我需要的东西。我需要做的是每次单击按钮时,从文本文件中读取一行并将其输入到文本字段中。我认为一旦我对第一部分有了想法,后一部分就不难了。我对如何在点击时读取整个文件有一个想法,但每次都一行一行地让我卡住了。

我用这个位来查看每一行的数据是不是我要找的:

 private boolean validRecord( String line )
 {
    /** Local Variables **/

    boolean validRecord = true; // Assumes Good Data
    int     counter     = 0;

    for ( int i = 0; i < line; i++ )
    {
        if ( line.charAt( i ).isDigit )
           counter++;

        if ( !line.charAt( i ).isDigit )
           validRecord = false;
    }

    if ( counter != fieldArray.length )
       validRecord = false;

    return validRecord;
 }

如果有人可以提供帮助,我将不胜感激,因为这是我第一次处理从文件中读取的问题。谢谢。为了进一步澄清,我想在第一次点击时读取第一行,每次点击时读取下一行,直到文件被一路搜索。

public void fileReader( String inputFile )
{
    /** Local Constants **/

    final String ERROR = "File Error!";

    /** Local Variables **/

    BufferedReader inStream = null;
    Scanner        in;
    String         line;

    if ( isReadableFile( inputFile ) )
    {
       try
       {
         in = new Scanner( new File( inputFile ) );

         line = in.next();

         while ( in.hasNextLine() )
         {
            line  = in.nextLine();
            int j = 0;

            if ( validRecord( line ) )
            {
                for ( int i = 0; i < line.length(); i++ )
                {
                    if ( Character.isDigit( line.charAt( i ) ) )
                    {
                        fieldArray[ j ].setText( line.charAt( i ) +
                                                 BLANK );
                        j++;
                    }
                }
            }

            else
               System.out.println( "Invalid Record" );
          }

          in.close();
        }

        catch ( Exception e )
        {
            System.out.println( ERROR );
        }
    }

    else
       System.out.println( "File not readable" );
}


public void actionPerformed( ActionEvent e )
{
    if ( e.getSource()      == btnClear )
       clearTextFields();

    else if ( e.getSource() == btnExit )
       System.exit( 0 );

   else if ( e.getSource() == btnCheck )
   {
        testMagicSquare();
        jtaOutput.setLineWrap ( true );
    }

   else if ( e.getSource() == btnFileInput )
      fileReader( jtfFileInput.getText() );

【问题讨论】:

  • 为什么在按钮点击时一次读取一行?为什么不简单地在程序开始时将整个文件读入ArrayList&lt;String&gt;,然后在按下按钮时获取列表中的下一个字符串?
  • 我的教授希望这样做。
  • 为了进一步澄清,因为我是这个特殊事物的新手(文件读取),我只想指出正确的方向,所以我仍然可以弄清楚这就是为什么我没有不要在原始帖子中留下更多代码。
  • 我改用了 BufferedReader 并且稍微接近了一点。我知道抢到第一线,但从不超过它。

标签: java swing file readline


【解决方案1】:

这就是我的教授希望它完成的方式。

很公平。

  • 使用 Scanner 对象,
  • 致电if (myScanner.hasNextLine())
  • 如果属实,请通过line = myScanner.nextLine() 拨打电话。
  • 请务必在完成该 Scanner 对象后关闭它,方法是在检查以确保它不为空之后对其调用 close()

编辑
我不能说我还理解你的代码,但我担心你所有的文件读取代码都在一个位置,都在一个 while (scanner.hasNextLine()) 中,我认为这不会起作用。我认为你将不得不...

  • 创建一个用于读取文件的 Scanner 对象,并确保它已在类级别声明。那就是创建一个私有类 Scanner 字段。
  • 开始程序时使用扫描仪打开文件,可能在类的构造函数中。
  • 那么不要从中读取。直到按下按钮。
  • 在您的阅读按钮的 actionPerformed 方法中,检查 Scanner once 以查看它是否为 hasnextLine(),如果是,则仅在其上调用 nextLine() once。这里不涉及 while 循环。
  • 仅当 hasNextLine() 返回 false 时关闭扫描程序。

【讨论】:

  • @ScottKocos:试试看。 ;-)
  • 谢谢,我们会试一试,看看会发生什么。
  • 我试了一下。看来我在我认为很简单的部分上被耽搁了。如果它通过了我的验证,此时它确实通过了,它应该用该行中的值填充我的 gui 中的 jtextfields。然而,它并没有这样做。我又被难住了。
  • 我把方法放在上面了。似乎它没有正确读取,或者它以某种方式失败了我高度怀疑的最后一个 if 语句。
  • @ScottKocos:我没有看到 ActionListener,也没有发布 actionPerformed 方法。我只是看到你似乎一口气读完了整个文件。您似乎还可能正在关闭循环内的扫描仪,该扫描仪会进行读取,这会使事情变得混乱。
【解决方案2】:

我做了一个彻底的转换并尝试了其他方法。使用扫描仪,我没有成功地将内容读入文本字段。我决定只是为了它切换到 BufferedReader 并且在第一次尝试时就奏效了。至于处理逐行获取,我将 bufferedreader 设为一个类变量,并制作了另一个按钮来打开文件,并在点击时检查每一行。

这解决了每次点击时实例化/打开文件的问题。

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多