如何编写文件并将该文件再次读入临时文件

时间:2014-07-17 11:28:48

标签: java swing

edit "second version"

我使用ANTLR构建Java swing以获取源代码树。为了获得从ANTLR构建的树图像,我使用的是GRAPHVIZ,http://www.graphviz.org/

因此,Graphviz将写入扩展名为.dot的文件,然后我将其加载到我的Swing应用程序中。我的代码就像这样

String OS = System.getProperty("os.name");
        Runtime rt = Runtime.getRuntime();
        BufferedWriter bw = null;
        File tempDir = new File(System.getProperty("java.io.tmpdir"));

        File tempInput;
        try {
            tempInput = File.createTempFile("output", ".dot", tempDir);
            File tempOutput = File.createTempFile("tree", ".png", tempDir);

            if (OS.equals("Linux")) {

                try {

                    bw = new BufferedWriter(new FileWriter(tempInput.getAbsoluteFile()));
                    bw.write(st2);
                    bw.close();

                    Process pr = rt.exec("dot -Tpng  /tmp/output.dot -o "
                            + "/tmp/tree.png");

                } catch (IOException ex) {
                    System.out.println("failed to write the image file");
                }

            } else {

                try {

                    bw = new BufferedWriter(new FileWriter(tempInput.getAbsoluteFile()));
                    bw.write(st2);
                    bw.close();

                    String dotPath = "C:\\Program Files (x86)\\Graphviz2.38\\bin\\dot.exe";
                    String fileInputPath = tempInput.toString();
                    String fileOutputPath = tempOutput.toString();
                    String tParam = "-Tpng";
                    String tOParam = "-o";

                    String[] cmd = new String[5];
                    cmd[0] = dotPath;
                    cmd[1] = tParam;
                    cmd[2] = fileInputPath;
                    cmd[3] = tOParam;
                    cmd[4] = fileOutputPath;

                    rt.exec(cmd);

                } catch (IOException ex) {
                    System.out.println("Failed to write to file");
                } finally {

                }
            }
        } catch (IOException ex) {
            Logger.getLogger(MainAlgoritma.class.getName()).log(Level.SEVERE, null, ex);
        }

你知道,windows中的输出应该命名为tree.png。但窗户不能给我这个名字。名称是动态变化的 tree2593490478729479216.png,有时候像tree9133268802668231475.png等。

我的问题是:

  1. 如何获得名称只是tree.png?
  2. 如何在读取图像并将其加载到app?

    后删除处理后的图像

    修改

  3. 现在,如何阅读该图像,然后将其加载到应用程序......? 我再次上​​课加载图像,但你知道,我仍然感到困惑。

    private BufferedImage image;
    String tmpfolder = System.getProperty("java.io.tmpdir");
    
    public FileImage() {
    
        if (OS.equals("Linux")) {
            try {
                image = ImageIO.read(new File(tmpfolder+"/tree.png"));
            } catch (IOException ex) {
                System.out.println("Image failed to load..!!! ");
            }
        } else {
    
            try {
                image = ImageIO.read(new File(tmpfolder+"\\tree.png"));
            } catch (IOException ex) {
                System.out.println("Image failed to load...!!! ");
            }
        }
    
        JLabel jLabel = new JLabel(new ImageIcon(image));
        jPanel3.add(jLabel);
    
    }
    

2 个答案:

答案 0 :(得分:1)

您可以使用相对路径或在Swing中使用JFileChooser来打开文件选择器,让用户选择输入和/或输出文件。

答案 1 :(得分:0)

  

如何获得名称只是tree.png

您应该阅读正在使用的createTempFile方法的javadoc。它清楚地表明您作为参数传入的字符串是前缀和后缀。

如果您更换

File.createTempFile("output", ".dot", tempDir);

通过

tempInput = new File( tempDir, "output.dot" );
tempInput.createNewFile();

它应该有用。

注意我是如何使用带有两个参数的File构造函数的。这可以避免您正在使用的操作系统上出现丑陋的switch语句。