2

二重の数値を取得してバイナリ ファイルに格納するように設計された小さなアプリケーションがあります。次に、それらをすべて再度1つずつ読み取り、配列に格納しますが、ファイルを適切に読み取る方法がわかりませんか?

コードは次のとおりです。

     import java.awt.*;
     import java.awt.event.ActionEvent;
     import java.awt.event.ActionListener;
     import java.io.*;
     import java.util.ArrayList;

     import net.miginfocom.swing.MigLayout;

     import javax.swing.*;


  public class Q3 extends JFrame {

private JPanel thePanel;
private JLabel lblDouble;
private JTextField txtDouble;
private JButton btnAdd, btnStore, btnRead;

ArrayList<Double> doubleNumberArray = new ArrayList<Double>();
ArrayList readArr = new ArrayList();
int index = 0;
int index2 = 0;

String fileName = "data.dat";

FileOutputStream fileOut = null;
DataOutputStream dOut = null;

FileInputStream fileIn = null;
DataInputStream dIn = null;

public static void main(String[] args) {

    new Q3();


}

public Q3() {

    this.setSize(250, 150);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);

    Color myColor = new Color(54, 139, 255);

    thePanel = new JPanel(new MigLayout());
    thePanel.setBackground(myColor);

    lblDouble = new JLabel("Enter a Double ");
    // Text Field
    txtDouble = new JTextField(5);
    // Buttons
    btnAdd = new JButton("Add");

    btnStore = new JButton("Store");

    btnRead = new JButton("Read File");

    ListenerForButton lForAddButton = new ListenerForButton();
    // Adding action listener to buttons
    btnAdd.addActionListener(lForAddButton);
    btnStore.addActionListener(lForAddButton);
    btnRead.addActionListener(lForAddButton);

    thePanel.add(lblDouble);
    thePanel.add(txtDouble, "wrap");
    thePanel.add(btnAdd, "skip1,split2");
    thePanel.add(btnStore, "wrap");
    thePanel.add(btnRead, "skip1");


    this.add(thePanel);
    this.setVisible(true);

}

// Implement Listener

public class ListenerForButton implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == btnAdd) {

            double convertDouble = Double.parseDouble(txtDouble.getText());
            doubleNumberArray.add(index, convertDouble);
            index++;
            txtDouble.setText("");

            System.out.print(doubleNumberArray);

        } else if (e.getSource() == btnStore) {

            for (int i = 0; i < doubleNumberArray.size(); i++) {

                try {

                    fileOut = new FileOutputStream(fileName);

                    dOut = new DataOutputStream(fileOut);

                    dOut.writeDouble(doubleNumberArray.get(i));


                } catch (Exception ex) {

                    ex.printStackTrace();

                } finally {
                    try {
                        dOut.close();


                    } catch (IOException e1) {

                        e1.printStackTrace();
                    }
                }

            } // end of loop

            //System.out.println("Done");
            doubleNumberArray.clear();// empty our array
            index = 0;

        } else if (e.getSource() == btnRead) {

            try {

                fileIn = new FileInputStream(fileName);
                dIn = new DataInputStream(fileIn);

                System.out.println("Din" + dIn.available());

                try {

                    double d ;

                    while (dIn.available() > 0) {

                        d =  dIn.readDouble();
                        readArr.add(d);



                    }

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

            } catch (Exception exception) {
                exception.printStackTrace();
            }

            System.out.print(readArr);

        }


    }// end of read button

}// action performed

}// リスナーの終わり

4

2 に答える 2

3

プリミティブ型をそれぞれ読み書きする場合は、DataInputStreamDataOutStreamを使用します。この例から始めることができます。

ファイルの終わりまで読み取るサンプル。DataStreams は、無効な戻り値をテストする代わりに、EOFException をキャッチすることによってファイルの終わりの状態を検出することに注意してください。DataInput メソッドのすべての実装は、戻り値の代わりに EOFException を使用します。

public class Q3 extends JFrame
{
    private final JPanel thePanel;
    private final JLabel lblDouble;
    private final JTextField txtDouble;
    private final JButton btnAdd, btnStore, btnRead;

    private final List<Double> doubleNumberArray = new ArrayList<Double>();
    private final List<Double> readArr = new ArrayList<Double>();
    private int index = 0;

    private final String fileName = "c:/home/data.dat";

    public static void main(String[] args)
    {
    new Q3();
    }

    public Q3()
    {
    this.setSize(250, 150);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);

    Color myColor = new Color(54, 139, 255);

    thePanel = new JPanel();
    thePanel.setBackground(myColor);

    lblDouble = new JLabel("Enter a Double ");
    // Text Field
    txtDouble = new JTextField(5);
    // Buttons
    btnAdd = new JButton("Add");
    btnStore = new JButton("Store");
    btnRead = new JButton("Read File");

    // Adding action listener to buttons
    btnAdd.addActionListener(new ListenerForButton());
    btnStore.addActionListener(new StoreButtonListener());
    btnRead.addActionListener(new ReadButtonListener());

    thePanel.add(lblDouble);
    thePanel.add(txtDouble, "wrap");
    thePanel.add(btnAdd, "skip1,split2");
    thePanel.add(btnStore, "wrap");
    thePanel.add(btnRead, "skip1");

    this.add(thePanel);
    this.setVisible(true);
    }

    public class ReadButtonListener implements ActionListener
    {
    @Override
    public void actionPerformed(ActionEvent e)
    {
        DataInputStream din = null;
        try
        {
        din = new DataInputStream(new FileInputStream(fileName));
        readArr.clear();

        while (true)
        {
            Double data = din.readDouble();
            System.out.printf("\n-> %s \n ", data);
            readArr.add(data);
        }
        }
        catch (EOFException ignore)
        {
        }
        catch (Exception ioe)
        {
        ioe.printStackTrace();
        }
        finally
        {
        if (din != null)
        {
            try
            {
            din.close();
            }
            catch (IOException e1)
            {
            e1.printStackTrace();
            }
        }
        }
    }
    }

    public class StoreButtonListener implements ActionListener
    {
    @Override
    public void actionPerformed(ActionEvent e)
    {
        DataOutputStream outFile = null;
        try
        {
        outFile = new DataOutputStream(new FileOutputStream(fileName));

        for (int i = 0; i < doubleNumberArray.size(); i++)
        {
            Double d = doubleNumberArray.get(i);
            System.out.printf("\nWriting to file %s", d);
            outFile.writeDouble(d);
        }
        }
        catch (Exception ex)
        {
        ex.printStackTrace();
        }
        finally
        {
        if (outFile != null)
        {
            try
            {
            outFile.close();
            }
            catch (IOException e1)
            {
            e1.printStackTrace();
            }
        }
        }
        doubleNumberArray.clear();// empty our array
        index = 0;
    }
    }

    public class ListenerForButton implements ActionListener
    {
    @Override
    public void actionPerformed(ActionEvent e)
    {
        double convertDouble = Double.parseDouble(txtDouble.getText());
        doubleNumberArray.add(index, convertDouble);
        index++;
        txtDouble.setText("");
    }
    }
}
于 2013-05-18T02:32:21.307 に答える
2

DataInputStreamファイルからの読み取りとファイルDataOutputStreamへの書き込みに使用します。

なぜ?DataInputStream_DataOutputStream

これらのクラスは変更されReadingたとをサポートしているためです。Writing UTF-8

何が変更され UTF-8ますか?

Modified UTF-8は、データが の形式で読み書きされることを意味しJava Primitive Typesます。ファイル内のJava変数read / writeをまっすぐにすることができます。

書き込み:

DataOutputStream out = new DataOutputStream(new FileOutputStream("MyBinaryFile.txt"));
out.writeDouble(double d);

読む:

DataInputStream in = new DataInputStream(new FileInputStream("MyBinaryFile.txt"));
while(in.available() > 0)
{
in.readDouble();
}

注:同じストリームクラスReadを使用していることを確認してください。Write

回答が更新されました:

1)この 2 回線をforループから外します。

fileOut = new FileOutputStream(fileName);
dOut = new DataOutputStream(fileOut);

2)doubleNumberArrayまた、ファイルに書き込む前に要素がいくつ存在するかを確認します。

3)この行double dを while ループから取り出します。dwhile ループの外側で定義してから使用しますd = dIn.readDouble()

4)readArr.add(d)の代わりに を使用しreadArr.add(index2,d)ます。ArrayList必要に応じて独自にインデックスを作成するためです。

于 2013-05-18T02:54:41.060 に答える