0

i'm writing a java program in eclipse that take a file as input and write a new file as output follow some logic.

i use datainputstream for the input file and dataoutputstream for the output file. i use those for the readln() method that works well.

now i have a problem with the write() method, simply it doesn't write anything! i've tryed also randomAccess for the input, and/or bufferedoutputstream for the output.

i've tryed in a separate java project this:

public static void main (String[] args){

    File output = new File("MyOutputDirectoryHere");

    try{
        DataOutputStream  dos = new DataOutputStream(new     BufferedOutputStream(new FileOutputStream (output)));
        for(int i=0; i<1000; i++){
            dos.write(i);
        }
        dos.close();
    }
    catch (IOException e){
        System.err.println(e);
    }   
}

and it works perfectly

but inside this mess:

import java.io.*;
import javax.swing.*;

public class apri_file {        
@SuppressWarnings("deprecation")
public static void main(String[] args){
    File inputFile = null;
    File outputFile = null;
    String dati;
    int dato;

    try {
        JFileChooser FileWindow = new JFileChooser();
        FileWindow.isDirectorySelectionEnabled();

        FileWindow.setApproveButtonText("Open IPL File");
        if(FileWindow.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
            inputFile = FileWindow.getSelectedFile();
            System.out.println("input path: " + inputFile.getAbsolutePath());
        }

        DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream(inputFile)));
        System.out.println("input buffer reader created");
        /**************************/

        FileWindow.setApproveButtonText("Save PLY FIle");
        if(FileWindow.showSaveDialog(null) == JFileChooser.APPROVE_OPTION){
            outputFile = new File (FileWindow.getSelectedFile(),"");
            System.out.println("output path: " + outputFile.getAbsolutePath());
        }

        DataOutputStream  out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream (outputFile)));
        /**************************/

        /*
         * to do write header
         */
        for(int i=0;i<inputFile.length();i++){
            dati = in.readLine();
            if(dati == null){
                break;
            }
            if(dati == "vnod"){
                while(in.read() != 0X65){
                    dato = in.read();
                    if(dato == 0X09 || dato == 0X0D || dato == 0X2C){   }
                    else if(dato == 0X2E) out.write(0X2C);                      
                    else out.write(dato);
                }
            }
            if(dati == "link"){
                int virgola = 0;
                dato = in.read();
                while(dato != 0X65){
                    if(virgola < 4){
                        if(dato == 0X2C) virgola++;
                        if(dato == 0X09 || dato == 0X0D){}
                        else out.write(dato);
                    }
                    else{
                        while(dato != 0X0D) {
                            dato = in.read();
                        }
                        virgola = 0;
                        out.write(0X0D);//nl
                        out.write(0X34);//4
                        out.write(0X20);//space
                    }
                    dato = in.read();

                }//while link
                end = true;
            }//if link
        }//while file

                    //testing the write() method
        for(int i=0; i<1000; i++){
            out.write(0X2C); //tricky part! this output will be always written!! WTF!
        }
        in.close();
        out.close();

        JOptionPane.showMessageDialog(null, "Done!", "Done!" , JOptionPane.INFORMATION_MESSAGE);            
    }
    catch (IOException e){
        System.out.println(e + "\n");
    }
}
}

in the code above the write(int b) method doesn't write anything in my output file on desktop, except for the for loop coded at the end... that part of code works well...

i dont know what to do. please help.

  • Have you confirmed that `dati` does indeed equal "vnod" or "link"? – vegasje Jan 10 '14 at 00:32
  • do you have an example IPL file? – Mark W Jan 10 '14 at 00:47
  • See my answer to solve your problem, it's a very typical pitfall e.g. if someone coming from c++ to java. Further, I recommend you became familiar using a debugger. – Joe Jan 10 '14 at 01:38
  • To Mark W: the IPL file caming from GTAIV\common\data\maps, i'm writing a little .ipl2ply. converter for import that in blender. after i was thinking about an smd converter, but already exist .-. –  Jan 10 '14 at 23:32

2 Answers2

1

In java, you cannot compare strings using ==. You have to use equals()

if (dati.equals("vnod")) ...

The == just compare the reference (like a pointer) of equalness and not it's referenced content.

See also here.

Community
  • 1
  • 1
Joe
  • 3,090
  • 6
  • 37
  • 55
  • While true, I don't see what that has to do with the problem he's having in particular. – Martin Tuskevicius Jan 10 '14 at 01:23
  • @MartinTuskevicius It matters because all of the write() statements are inside of the if statements comparing strings with the == operator – Mark W Jan 10 '14 at 01:29
  • 1
    Looking at his code, it's write() calls are all after that kind of if() condition. As long as that if() contitions will never become true, the code is never reached. – Joe Jan 10 '14 at 01:30
  • Perfect! now the code works, i'm new with operation on file and strings, i'll make treasure of this. thanks. –  Jan 10 '14 at 23:36
0

You should close all your streams in finally blocks. Clearly the output stream isn't being closed here.

user207421
  • 305,947
  • 44
  • 307
  • 483