Обработка файла (двоичный файл с расширением .dat) в Java, возвращая неизвестную ошибку времени компиляции - PullRequest
0 голосов
/ 27 февраля 2020
void abIn()throws IOException
{

    FileOutputStream fos=new FileInputStream("abc.dat");
    DataOutputStream dos = new DataInputStream(fos);
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    for(int i=0;i<5;i++)
    {
        System.out.println("Enter PC, Price Quantity  "+(i+1));
        pc=Integer.parseInt(br.readLine());
        up=Double.parseDouble(br.readLine());
        q=Integer.parseInt(br.readLine());
        dos.writeInt(pc);
        dos.writeDouble(up);
        dos.writeInt(q);
    }
    dos.close();
    fos.close();
}
void abOut()throws IOException
{
    FileInputStream fin=new FileInputStream("ABC.DAT");
    DataInputStream din=new DataInputStream(fin);
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter Product Code");
    int x=Integer.parseInt(br.readLine());
    boolean EOF =false;
    while(!EOF)
    {
        try
        {
            int pcx =din.readInt(pc);
            int upx=din.readDouble(up);
            int qx=din.readInt(q);
            if(pcx==x)
            {
                System.out.println(pcx+" "+upx+" "+q);
            }
        }
        catch(EOFException e)
        {}
    }
    din.close();
    fin.close();
}
public static void main()throws IOException
{
    f1 ob=new f1();
    ob.abIn();
    ob.abOut();
}

Неизвестная ошибка времени компиляции. Я попытался создать файл данных с кодом продукта, ценой продукта и количеством (в единицах) в Java, а затем выполнить поиск по коду продукта и получить другие данные, как указано выше.

1 Ответ

1 голос
/ 27 февраля 2020

Существует пять ошибок компиляции, и они вовсе не «неизвестны».

f1.java:11: error: incompatible types: FileInputStream cannot be converted to FileOutputStream
    FileOutputStream fos=new FileInputStream("abc.dat");
                         ^
f1.java:12: error: incompatible types: FileOutputStream cannot be converted to InputStream
    DataOutputStream dos = new DataInputStream(fos);
                                               ^
f1.java:39: error: method readInt in class DataInputStream cannot be applied to given types;
            int pcx =din.readInt(pc);
                        ^
  required: no arguments
  found: int
  reason: actual and formal argument lists differ in length
f1.java:40: error: method readDouble in class DataInputStream cannot be applied to given types;
            int upx=din.readDouble(up);
                       ^
  required: no arguments
  found: double
  reason: actual and formal argument lists differ in length
f1.java:41: error: method readInt in class DataInputStream cannot be applied to given types;
            int qx=din.readInt(q);
                      ^
  required: no arguments
  found: int
  reason: actual and formal argument lists differ in length

Начиная с первых двух:

Если вы хотите создать FileOutputStream, создайте FileOutputStream. То же самое касается DataOutputStream. Вы не можете создать объект, предназначенный для чтения файла, а затем попросить его записать в файл. Это не то, что он делает.

Итак, вам нужно изменить это:

FileOutputStream fos=new FileInputStream("abc.dat");
DataOutputStream dos = new DataInputStream(fos);

на эти:

FileOutputStream fos=new FileOutputStream("abc.dat");
DataOutputStream dos = new DataOutputStream(fos);

Остальные ошибки довольно очевидны. Методы DataInputStream readInt и readDouble не принимают никаких аргументов.

Если вы хотите получить немного воды из крана, вы не ожидаете, что предоставят Ваша собственная вода просто чтобы получить немного воды. Точно так же вы не должны предоставлять целочисленное значение , когда хотите прочитать целочисленное значение; весь смысл вызова readInt заключается в том, что у вас нет целочисленного значения, и вы хотите, чтобы DataInputStream предоставил вам его.

Поэтому вам не следует передавать ваше собственное значение в метод чтения. Вы должны передавать нулевые аргументы (то есть вызывать метод с пустыми скобками).

Кроме того, в Java метод уникально идентифицируется как по имени, так и по аргументам, поэтому вы должны передавать точно так же аргументы, как этот метод объявляет. readInt и readDouble объявлены с нулевыми аргументами, поэтому вы должны передать нулевые аргументы.

Следовательно, вы должны изменить эти три строки:

int pcx =din.readInt(pc);
int upx=din.readDouble(up);
int qx=din.readInt(q);

на эту:

int pcx =din.readInt();
int upx=din.readDouble();
int qx=din.readInt();

Наконец, вы не должны игнорировать EOFException. Это исключение означает, что больше нет данных для чтения, так почему вы хотите продолжать пытаться читать данные?

Правильная вещь, которую нужно сделать, это прекратить чтение данных:

catch (EOFException e)
{
    break;
}

Поскольку ваш Переменная EOF никогда не используется, вы можете переписать l oop следующим образом:

try
{
    while (true)
    {
        int pcx = din.readInt();
        int upx = din.readDouble();
        int qx = din.readInt();
        if (pcx == x)
        {
            System.out.println(pcx+" "+upx+" "+q);
        }
    }
}
catch(EOFException e)
{
    System.out.println("No more data.");
}

l oop завершится при обнаружении исключения.

...