2

.xml ファイルから情報を抽出して文字列に変換し、その文字列を .txt ファイルに書き込む Java プログラムがあります。このファイルは、複数の .xml ファイルからのすべての入力を保持する 2 番目の .txt ファイルに追加されます。Mac 上の Eclipse では、プログラムはすべての .xml コードを最終的な .txt ファイルに正しく追加します。

ただし、Eclipse の Windows コンピューターで同じ Java プログラムを実行すると、最終的な .txt ファイルは、Mac の場合のようにすべての入力を収集しません。Windows と Mac でファイルの読み取り/書き込みに既知の違いはありますか? 特に、最初に Mac で書かれたコードが Windows マシンに転送された場合は?

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

package edu.uci.ics.jung.samples;

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
import java.util.Scanner;

public class ReadXMLFile1 {

    public static void main(String argv[]) throws IOException { //throws ioexception allows the filewriter code below (specifically writing the "t# b" title)
          //while loop to grab all xml files in the form of name0, name1, name2, etc and perform txt file conversion
         int numberofgraphs=10; //indicate number of graphs importing/reading/appending
         int x=0;
         int b = 0;
          while (x < numberofgraphs){
                FileWriter pagetowrite = new FileWriter("graphtotal1.txt", true); //true says to append string "scannedstuff" to graphtotal.txt (graphtotal.txt can be replaced by any file in visualization folder, you name it!)
                BufferedWriter now = new BufferedWriter(pagetowrite); //more advanced file writer, included in order to use newLine() method below
                now.write("t# "+b); //writes the title t# "b" at top of each graph set
                now.newLine(); //returns to next line of file (helps keep format of original .txt)
                now.close(); //ends file writing for that line of text file



              try {

                  String xmlname = ("Untitled"+b+".xml");

                  File fXmlFile = new File(xmlname);
                  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                  DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                  Document doc = dBuilder.parse(fXmlFile);
                  doc.getDocumentElement().normalize();


                  NodeList oList = doc.getElementsByTagName("node"); //writing to txt file the node info
                  for (int temp = 0; temp < oList.getLength(); temp++) {

                       Node oNode = oList.item(temp);
                       if (oNode.getNodeType() == Node.ELEMENT_NODE) {

                          Element fElement = (Element) oNode;

                          String nodename = getTagValue("name", fElement);
                          char nodenumber = nodename.charAt( 1 );
                          String nodelabel = getTagValue("string", fElement);

                          FileWriter pagetowriteon = new FileWriter("newinput1.txt", true); //true says to append string "scannedstuff" to newinput1.txt (newinput1.txt can be replaced by any file in visualization folder, you name it!)
                        BufferedWriter out = new BufferedWriter(pagetowriteon); //more advanced file writer, included in order to use newLine() method below
                        out.write("v"+ " "); //writes the letter v to indicate a node
                        out.write(nodenumber+" "); //writes number of node created
                        out.write(nodelabel); // writes the name of node..its label
                        out.newLine(); //returns to next line of file (helps keep format of original .txt)
                        out.close(); //ends file writing for that line of text file

                       }
                    }
                  NodeList nList = doc.getElementsByTagName("arc");//writing to txt file the arc info


                  for (int temp = 0; temp < nList.getLength(); temp++) {

                   Node nNode = nList.item(temp);
                   if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                      Element eElement = (Element) nNode;


                      //String arcname = getTagValue("name", eElement);
                      String arcnode1 = getTagValue("From", eElement);
                      char node1 = arcnode1.charAt( 1 );
                      String arcnode2 = getTagValue("To", eElement);
                      char node2 = arcnode2.charAt( 1 );
                      String arclabel = getTagValue("string", eElement);

                      FileWriter pagetowriteon = new FileWriter("newinput1.txt", true); //true says to append string "scannedstuff" to newinput1.txt (newinput1.txt can be replaced by any file in visualization folder, you name it!)
                    BufferedWriter out = new BufferedWriter(pagetowriteon); //more advanced file writer, included in order to use newLine() method below
                    out.write("u"+ " "); //writes the letter u to indicate an edge
                    out.write(node1+" ");
                    out.write(node2+ " ");
                    out.write(arclabel);
                    out.newLine(); //returns to next line of file (helps keep format of original .txt)
                    out.close(); //ends file writing for that line of text file

                   }
                }
                //an option (mostly for individual graph use with simplegraphview...probably unecessary since simplegraph not used until after Data mining) to write to a newly named textfile so can run simplegraph view without having to change file name
                  File file = new File("newinput1.txt");

                //File (or directory) with new name (makes it easy to change one file name here instead of two in code above)
                  File file2 = new File("newinput.txt");
                  file.renameTo(file2);

                //this strategy of appending-> keep-> allows you to change one file name for giant append file..Filewriter line below ("graphtotal.txt")

                //start of appending text file
                 // boolean graphready;
              //assign if(boolean){ = to true when ready to append
                  if (true){
                    File file3 = new File ("newinput.txt"); //indicate which file
                    Scanner scan = new Scanner (file3); //read the text file indicated above
                            while (scan.hasNextLine()){ //will loop until no more lines of code detected; this loop reads and appends text to desired file
                                String scannedstuff3 = scan.nextLine(); //converts next line of code to a string
                                FileWriter pagetowriteon = new FileWriter("graphtotal.txt", true); //true says to append string "scannedstuff" to graphtotal.txt (graphtotal.txt can be replaced by any file in visualization folder, you name it!)
                                BufferedWriter out = new BufferedWriter(pagetowriteon); //more advanced file writer, included in order to use newLine() method below
                                //out.write("t# "+b); //writes the title t3 0 at top of each graph set
                                //out.newLine(); //returns to next line of file (helps keep format of original .txt)
                                out.write(scannedstuff3); //writes scanned line of code to new file indicated in FileWriter("desiredfile.txt", true)
                                out.newLine(); //returns to next line of file (helps keep format of original .txt)
                                out.close(); //ends file writing for that line of text file

                            }
                            scan.close(); //ends scanning of txt file indicated
                }

              } catch (Exception e) {
                e.printStackTrace();
              }
              x=x+1;
              b=b+1;


          }
    }






  private static String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

        Node nValue = (Node) nlList.item(0);

    return nValue.getNodeValue();
  }

}
4

1 に答える 1

0

BufferedWriter のフラッシュを見てください。バッファリングは、基盤となる OS によって制御されるため、プラットフォームごとに異なります。

于 2012-11-29T19:49:47.233 に答える