2009-07-04 11 views
0

効率的な方法でファイルを読む方法は?任意のメソッドを提案する..私は非常に遅いですBufferedReaderを使用..任意の変更を提案する??ファイルを効率よく読み取る方法

CODE:

import java.io.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.lang.StringBuffer; 

/*The main class file starts here*/ 

class TitleCaseRow10 extends JFrame implements ActionListener,FocusListener 
{ 

// Declare the required variables 

JButton jbFileLoad,jbFileSave,jbCaseChange; 
JLabel jlTitle,jlFileSelect,jlContentDisplay; 
Font myFont; 
JPanel mainPanel,fileOperationPanel,buttonPanel,fileOpenPanel; 
JFrame jframe; 
JTextField jtfFileName; 
JTextArea jtaFileContent,jtaCaseChange; 
JScrollPane jScrPaneContent,jScrPaneCaseChange; 
boolean boolFileOk = false; 
File file; 
String fileName,strFileContent,strBuffer=""; 
JFileChooser fileChooser; 

// Constructor method for TitleCaseRow10 

TitleCaseRow10(String titleName) 
{ 
    super(titleName); 

} 

void createAndShowGUI() 

/* This method is used to create the Graphical User Interface 
    and show it in the screen. 
    This method takes no input parameters 
    nor does it return any value. 
*/ 

{ 

    // create and set up the window 

    jframe = new JFrame(); 
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jframe.setSize(500,600); 

    // create the panels 
    // 1. mainPanel for containing other panels 
    // 2. buttonPanel for containing buttons 
    // 3. fileOpenPanel for containing file choose text filed 
    // and load file button 
    // 4. fileOperationPanel for containing all the file operation objects 

    mainPanel = new JPanel(); 
    buttonPanel = new JPanel(); 
    fileOperationPanel = new JPanel(); 
    fileOpenPanel = new JPanel(); 

    // create a file chooser 
    fileChooser = new JFileChooser(); 

    // create labels and buttons 

    jlTitle = new JLabel("TITLE CASE CHANGER",JLabel.CENTER); 
    jlFileSelect = new JLabel("Enter the filename or click 'load file'"); 
    jlContentDisplay = new JLabel("TEXT DISPLAY AREAS",JLabel.CENTER); 
    jbFileLoad = new JButton("Load File"); 
    jbFileSave = new JButton("Save File"); 
    jbCaseChange = new JButton("Title Case"); 

    //Create text feild, text area and scroll panes 

    jtfFileName = new JTextField(28); 
    jtaFileContent = new JTextArea(30,10); 
    jtaCaseChange = new JTextArea(30,10); 
    jScrPaneContent = new JScrollPane(jtaFileContent); 
    jScrPaneCaseChange = new JScrollPane(jtaCaseChange); 


    // set up the panels 

    fileOperationPanel.setBackground(Color.BLACK); 
    fileOpenPanel.setBackground(Color.BLACK); 
    buttonPanel.setBackground(Color.BLACK); 
    mainPanel.setBackground(Color.BLACK); 
    mainPanel.setLayout(new GridLayout(3,0,15,15)); 
    fileOperationPanel.setLayout(new GridLayout(5,0,5,5)); 
    fileOpenPanel.setLayout(new FlowLayout()); 
    buttonPanel.setLayout(new FlowLayout()); 

    // set up text field, labels and text area 

    // set the font 
    myFont = new Font("Constantia",1,15); 
    jtfFileName.setFont(myFont); 
    jlTitle.setFont(myFont); 
    jlContentDisplay.setFont(myFont); 
    jtaFileContent.setFont(myFont); 
    jtaCaseChange.setFont(myFont); 
    jlFileSelect.setFont(new Font("Arial",0,14)); 

    // set line wrap 
    jtaFileContent.setLineWrap(true); 
    jtaCaseChange.setLineWrap(true); 

    //set foreground and background color 
    jlTitle.setForeground(Color.WHITE); 
    jlContentDisplay.setForeground(Color.WHITE); 
    jlFileSelect.setForeground(Color.WHITE); 
    jtaFileContent.setForeground(Color.LIGHT_GRAY); 
    jtaCaseChange.setForeground(Color.LIGHT_GRAY); 
    jtfFileName.setForeground(Color.LIGHT_GRAY); 
    jtaFileContent.setBackground(Color.DARK_GRAY);  
    jtaCaseChange.setBackground(Color.DARK_GRAY); 
    jtfFileName.setBackground(Color.DARK_GRAY); 

    // Set default text to file content text area 
    jtaFileContent.setText("Type text here"); 

    // set up scroll panes 

    jScrPaneContent.setAutoscrolls(true); 
    jScrPaneCaseChange.setAutoscrolls(true); 
    jScrPaneCaseChange.getHorizontalScrollBar(); 
    jScrPaneCaseChange.getHorizontalScrollBar(); 

    // add the action listeners to buttons 

    jbFileLoad.addActionListener(this); 
    jbFileSave.addActionListener(this); 
    jbCaseChange.addActionListener(this); 
    jtaFileContent.addFocusListener(this); 

    // add all the components 

    jframe.add(mainPanel); 
    fileOpenPanel.add(jtfFileName); 
    fileOpenPanel.add(jbFileLoad); 
    buttonPanel.add(jbCaseChange); 
    buttonPanel.add(jbFileSave); 
    fileOperationPanel.add(jlTitle); 
    fileOperationPanel.add(jlFileSelect); 
    fileOperationPanel.add(fileOpenPanel); 
    fileOperationPanel.add(buttonPanel); 
    fileOperationPanel.add(jlContentDisplay); 
    mainPanel.add(fileOperationPanel); 
    mainPanel.add(jScrPaneContent); 
    mainPanel.add(jScrPaneCaseChange); 

    // set the frame visible 

    jframe.setVisible(true); 

} 

public void actionPerformed(ActionEvent ae) 
{ 
    String command = ae.getActionCommand(); 
    if(command.equals("Load File")) 
    { 
    System.out.println("Load File action"); 
    fileName = ""; 
    int retVal = fileChooser.showOpenDialog(this); 
    System.out.println("open dialog..."); 
    if(retVal==JFileChooser.APPROVE_OPTION) 
    { 
     try 
     { 
     file = fileChooser.getSelectedFile(); 
     fileName = fileChooser.getCurrentDirectory().getPath(); 
     fileName = fileName.concat("\\"+file.getName()); 
     jtfFileName.setText(fileName); 
     boolFileOk=true; 
     jtaFileContent.setText(""); 
     BufferedReader br= new BufferedReader(new FileReader(file),1000000); 
     while((strFileContent = br.readLine())!=null) 
      jtaFileContent.append(strFileContent+"\n"); 
     } 
     catch(Exception e) 
     { 
     System.out.println("Some problem : "+e); 
     } 
    } 

    } 
    if(command.equals("Title Case")) 
    System.out.println("Title Case action"); 
    if(command.equals("Save File")) 
    System.out.println("Save File action"); 

} 

public void focusGained(FocusEvent fe) 
{ 
    System.out.println("Focus Gained"); 
    if(!boolFileOk) 
    jtaFileContent.setText(""); 
} 
public void focusLost(FocusEvent fe) 
{ 

    System.out.println("Focus Lost"); 
} 

/* 

boolean loadFile(ActionEvent ae) 
{ 

    // Check if the filename textfield is really empty 

    if(jtfFileName.getText().trim().equals("")) 

    { 
    fileName = ""; 
    int retVal = fileChooser.showOpenDialog(TitleCaseRow10.this); 
    System.out.println("open dialog..."); 
    if(retVal==JFileChooser.APPROVE_OPTION) 
    { 
     try 
     { 
     file = fileChooser.getSelectedFile(); 
     fileName = fileChooser.getCurrentDirectory().getPath(); 
     fileName = fileName.concat("\\"+file.getName()); 
     jtfFileName.setText(fileName); 
     return true; 
     } 
     catch(Exception e) 
     { 
      System.out.println("Some problem : "+e); 
     } 
    } 
    } 

    return false; 
    // returns false if the filename is empty or 
    // if the file is not opened 
} 

*/ 


//***************************************************************** 

//the main method which creates an 
//instance of the class R10TitleCase 

//****************************************************************** 

public static void main(String args[]) 
{ 
    TitleCaseRow10 caseChanger = new TitleCaseRow10("Title Case"); 
    caseChanger.createAndShowGUI(); 
} 
} 
+4

あなたのサンプルコードは**長すぎる** – usr

+0

将来的にSSCCE(SSCCE.org)を行うことを検討してください!。ありがとう。 – kentcdodds

答えて

8

は "効率的" を定義します。あなたのアクセスパターンによって異なります。

BufferedReaderは、一度にファイルから1バイト(または数バイト)を読み込むと速度が上がります。そうしないと、無駄なオーバーヘッドになります。それでも、コードに何か間違ったことをしたり、非現実的な期待を持っていない限り、「非常に遅い」べきではありません。

非常に大きなファイル(java.nio)を読む場合は、具体的にはFileChannelがjava.ioよりはるかに優れたパフォーマンスを示します。

編集: 一度に(私はjtaFileContentがあるものだと仮定)JTextAreaに1行をファイルの内容を追加しているようだ - それはUIを毎回更新する必要があるためです(遅いものです、これには多くの作業が含まれます)、ファイルの読み込みではありません。代わりに、すべてのテキストをStringBuilderに読み込んで、すべてを取得したらJTextAreaのみを更新する必要があります。

しかし、ファイルが非常に大きい場合は、メモリが不足している可能性があり、表示されている部分だけを読み込む別のUIコンポーネントを探す必要があります。それのようなものがあるはずです。

3

あなたは実際には遅いファイルIOであると確信していますか?ハードコーディングされた文字列を使用して同じ数の行を追加するだけの場合は、高速ですか? GUIがあなたを減速させていたら、私は驚かないでしょう。

ところで、FileReaderは、プラットフォームのデフォルトエンコードを使用しますが、これは通常は悪い考えです。特定のエンコーディングのFileInputStreamInputStreamReaderを使用してください。 (そして、BufferedReaderでそれを包んでください。)最後にtry/finallyを使ってリーダーを閉じる必要があります。

2

問題は、あなたがjtaFileContentに直接追加していることです。 StringBuilderを読み込み、jtaFileContent.setText()を呼び出してみてください。

StringBuilder sb = new StringBuilder(100); 
for(Scanner sc = new Scanner(new FileReader(fileName)); sc.hasNext();) 
    sb.append(sc.nextLine()); 

jtaFileContent.setText(sb.toString()); 
+0

ねえ、私は..同じ結果を試しました:-( –

0

ここではいくつかの便利な方法があります。これら3つのメソッドの間で、ファイルまたはリソースをStringに読み込むことができます。私はいつもそれらを使います。私はあなたがそれらが役に立つことを願っ:

/** 
* Takes the file and returns it in a string 
* 
* @param location on the disc 
* @return the file in string form 
* @throws IOException 
*/ 
public static String fileToString(String location) throws IOException { 
    FileReader fr = new FileReader(new File(location)); 
    return readerToString(fr); 
} 

/** 
* Takes the given resource (based on the given class) and returns that as a string. 
* 
* @param location relative to the given class (for example "/resources/textFile.txt") 
* @param c the class the location is relative to 
* @return the file in string form 
* @throws IOException 
*/ 
public static String resourceToString(String location, Class c) throws IOException { 
    InputStream is = c.getResourceAsStream(location); 
    InputStreamReader r = new InputStreamReader(is); 
    return readerToString(r); 
} 

/** 
* Returns all the lines in the scanner's stream as a String 
* 
* @param r the InputStreamReader to read 
* @return the InputStreamReader in String form 
* @throws IOException 
*/ 
public static String readerToString(InputStreamReader r) throws IOException { 
    StringWriter sw = new StringWriter(); 
    char[] buf = new char[1024]; 
    int len; 
    while ((len = r.read(buf)) > 0) { 
    sw.write(buf, 0, len); 
    } 
    r.close(); 
    sw.close(); 
    return sw.toString(); 
} 
関連する問題