FileWriter не пишет в выходной файл - PullRequest
0 голосов
/ 03 марта 2019

Я могу запустить этот код, просто печатая на консоль, и все печатается нормально, а затем, когда я заменяю все System.out.println на outputStream.write ("некоторая строка"), ничего не записывается в выходной файл вообще.Это просто пусто.Первый файл является основным файлом.Тогда мои другие классы - MyStack и PostfixError.Я включу их ниже этого.Код принимает входные данные из входного файла, введенного в командной строке, а затем выводит его в файл, также указанный в командной строке.Входной файл должен быть в формате Postfix, например, ABC + - или AB + C.Если он не в этом формате, он выдаст ошибку.Если входные данные имеют такой формат, код примет эти входные данные и напишет инструкции, которые понадобятся для оценки выражения постфикса, если бы мы использовали компьютер только с одним регистром.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileWriter;

public class PostfixEvaluation{
    public static void main(String[] args) throws PostfixError, IOException{
        FileReader inputStream = null;
        FileReader inputStream2 = null;
        FileWriter outputStream = null;
        BufferedReader str = null;
        int c, j=1,letter;
        int stringSize = 100;
        String message, letterA, letterB;



        try {
            inputStream = new FileReader(args[0]); // input file
            inputStream2 = new FileReader(args[0]);
            outputStream = new FileWriter(args[1]); // output file
            str = new BufferedReader(inputStream);
            String nextLine; //= str.readLine();

            while ((nextLine = str.readLine()) != null) {
                outputStream.write("");
                outputStream.write("Current expression being evaluated is " + nextLine);
                MyStack letterStack = new MyStack(stringSize);
                try {

                    while ((c = inputStream2.read()) != 10){
                            //letterStack = EvaluateInstructions(c, letterStack,j); 
                        letter = c;
                        if (letter == 65){ // use an or to account for lower case letters
                            letterStack.push("A");
                        }else if (letter == 66) {
                            letterStack.push("B");
                        }else if (letter == 67) {
                            letterStack.push("C");
                        }else if (letter == 68) {
                            letterStack.push("D");
                        }else if (letter == 69) {
                            letterStack.push("E");
                        }else if (letter == 70) {
                            letterStack.push("F");
                        }else if (letter == 71) {
                            letterStack.push("G");
                        }else if (letter == 72) {
                            letterStack.push("H");
                        }else if (letter == 73) {
                            letterStack.push("I");
                        }else if (letter == 74) {
                            letterStack.push("J");
                        }else if (letter == 75) {
                            letterStack.push("K");
                        }else if (letter == 76) {
                            letterStack.push("L");
                        }else if (letter == 77) {
                            letterStack.push("M");
                        }else if (letter == 78) {
                            letterStack.push("N");
                        }else if (letter == 79) {
                            letterStack.push("O");
                        }else if (letter == 80) {
                            letterStack.push("P");
                        }else if (letter == 81) {
                            letterStack.push("Q");
                        }else if (letter == 82) {
                            letterStack.push("R");
                        }else if ( letter == 83) { 
                            letterStack.push("S");
                        }else if (letter == 84) {
                            letterStack.push("T");
                        }else if (letter == 85) {
                            letterStack.push("U");
                        }else if (letter == 86) {
                            letterStack.push("V");
                        }else if (letter == 87) {
                            letterStack.push("W");
                        }else if (letter == 88){ 
                            letterStack.push("X");
                        }else if (letter == 89) {
                            letterStack.push("Y");
                        }else if (letter == 90) {   
                            letterStack.push("Z");

                        }else if (letter == 42){                //letter == '*'
                            if (letterStack.isEmpty()|letterStack.length() <= 1) {
                                j=1;
                                throw new PostfixError("There are more operators than operands; This is not a valid expression.");
                            }else {
                                letterA = letterStack.pop();
                                letterB = letterStack.pop();
                                outputStream.write("LD   " + letterB);
                                outputStream.write("ML   " + letterA);
                                outputStream.write("ST   TEMP"+j);
                                letterStack.push("TEMP"+j);
                                //throw new PrintToOutput("hello");
                                //j++;
                            }
                        }else if (letter == 47) {               //letter == '/'
                            if (letterStack.isEmpty()|letterStack.length() <= 1) {
                                j=1;
                                throw new PostfixError("There are more operators than operands; This is not a valid expression.");

                            }else {
                                letterA = letterStack.pop();
                                letterB = letterStack.pop();
                                outputStream.write("LD   " + letterB);
                                outputStream.write("DV   " + letterA);
                                outputStream.write("ST   TEMP"+j);
                                letterStack.push("TEMP"+j);
                                //j++;
                            }
                        }else if (letter == 43) {               //letter == '+'
                            if (letterStack.isEmpty()|letterStack.length() <= 1) {
                                j=1;
                                throw new PostfixError("There are more operators than operands; This is not a valid expression.");

                            }else {
                                letterA = letterStack.pop();
                                letterB = letterStack.pop();
                                outputStream.write("LD   " + letterB);
                                outputStream.write("AD   " + letterA);
                                outputStream.write("ST   TEMP"+j);
                                letterStack.push("TEMP"+j);
                                //j++;
                            }
                        }else if (letter == 45) {               //letter == '-'
                            if (letterStack.isEmpty()|letterStack.length() <= 1) {
                                j=1;
                                throw new PostfixError("There are more operators than operands. This is not a valid expression.");

                            }else {
                                letterA = letterStack.pop();
                                letterB = letterStack.pop();
                                outputStream.write("LD   " + letterB);
                                outputStream.write("SB   " + letterA);
                                outputStream.write("ST   TEMP"+j);
                                letterStack.push("TEMP"+j);
                                //j++;
                            }
                        }else if (letter == 13) {
                            //do nothing
                        }else if (letter == -1) {
                            outputStream.write("");
                            outputStream.write("Success! File is finished being read.");
                            System.exit(0);
                        }else {
                            j=1;
                            //need to empty stack
                            throw new PostfixError( "This input has an incorrect character or combination of characters.");
                        }

                        if (c == 47 | c == 42 | c == 45 |c == 43) {
                            j++;
                        }else if (c == 13) {
                            j=1;
                        }
                    }


                }catch (PostfixError e) {
                    outputStream.write(e.getMessage());

                    //read input stream until it equals 10
                    do {
                        c=inputStream2.read();
                    }while (c !=10);

            }
            }
        } finally {
            if (inputStream != null) inputStream.close();
            if (inputStream2 !=null) inputStream2.close();
            if (outputStream != null) outputStream.close();
            str.close();
        }
    }
}

MyStack Class

public class MyStack {

    private String[] theStack;
    private int size;
    private int top;
    private int totalLength;

    public MyStack() {
        size = 100;
        theStack = new String[size];
        top = -1;
    }

    public MyStack(int stringSize) {
        size = 100;
        theStack = new String[stringSize];
        top = 0;
    }


    public void push(String symbol) {
        theStack[top] = symbol;
        top++;
    }

    public String pop() {
        return theStack[--top];

    }

    public boolean isEmpty() {
        if (top == -1) {
            return true;
        }else {
            return false;
        }
    }

    public int length() {
        return totalLength = top;
    }

    public void print() {
        for(int i=0;i<=top;i++){
            System.out.print(theStack[i]+ " ");
        }
        System.out.println();
    }
}

PostfixError Class

public class PostfixError extends Exception{
    public PostfixError(String message) {
        super(message);
    }    
}

1 Ответ

0 голосов
/ 03 марта 2019

Звоните System.exit;это немедленно выходит;ваш блок "finally" НЕ запущен.Как следствие, ваш BufferedWriter просто заброшен;ни flush(), ни close() не вызывается для него, что означает, что он не сбрасывает свой буфер в файл.

РЕШЕНИЕ: Не вызывайте System.exit там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...