2009-07-04 2 views
0

как эффективно читать файл в java ?? предлагаю любые методы .. я использовал BufferedReader, который очень медленный .. предложить любые изменения?Эффективный способ чтения файла

КОД:

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 собирается ускорить процесс, когда вы читаете из файла один байт (или несколько байтов) за раз, в противном случае это бесполезно накладные расходы. Тем не менее, это не должно быть «очень медленным», если вы не делаете что-то неправильно в своем коде или не имеете нереалистичных ожиданий.

Если вы читаете очень большие файлы, java.nio, speficically FileChannel имеет гораздо лучшую производительность, чем java.io.

Edit: Вы, кажется, добавив содержимое файла в JTextArea (я предполагаю, что это то, что jtaFileContent есть) одна строка в то время - вот что медленно (потому что он должен обновить пользовательский интерфейс каждый раз, который включает в себя много работы), а не чтение файла. Вместо этого вы должны прочитать весь текст в StringBuilder и обновить JTextArea только после того, как у вас есть все.

Однако, если ваш файл очень большой, возможно, у вас не хватит памяти и, возможно, придется искать другой компонент пользовательского интерфейса, который загружает только ту часть, которая отображается; должно быть что-то в этом роде.

3

Вы уверены, что это файл IO, который работает медленно? Если вы просто добавляете то же количество строк, используя стробированную строку, быстро? Я не удивлюсь, если бы это был GUI, который замедлял вас.

Кстати, FileReader будет использовать кодировку по умолчанию для платформы, что обычно плохое. Используйте FileInputStream и InputStreamReader с определенной кодировкой. (Затем, конечно, оберните его в BufferedReader.) У вас также должна быть попытка/наконец закрыть читателя в конце.

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

эй я пытался .. все тот же результат :-( – 2009-07-04 11:27:22

0

Вот несколько полезных методов. Между этими тремя способами вы можете прочитать файл или ресурс в 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(); 
} 
Смежные вопросы