Member 13730132 Ответов: 1

Как передать параметры из функции внутри класса в другую функцию в java. Посмотрите на функцию split() в коде. Помогите, пожалуйста.


Я новичок в программировании и java. Я создал приложение, чтобы открыть файл и отобразить информацию об этом . Я тоже хочу разделить этот файл. В функции с RandomAccessFile есть некоторая проблема в передаваемом параметре.
В функции split() Я хочу использовать поле fileName из функции showFiles (), но не могу найти способ сделать это. Пожалуйста, помогите мне.


package com.Naushad;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.io.RandomAccessFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.security.AccessController;






//class for awt
public class Main {

    private Frame myFrame;
    private Label topLabel;
    private Label message;
    private Label errorMessage;
    private Label botLabel1;
    private Label botLabel2;
    private Panel panel;
    public static String store;

    public Main(){
        makeGui();
    }

    public void makeGui(){

        myFrame = new Frame("Assignment");
        myFrame.setBackground(Color.white);
        myFrame.setSize(700,500);
        myFrame.setLayout(new GridLayout(6,1));

        //to close the window upon clicking cross button
        myFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent){
                System.exit(0);
            }
        });

        topLabel = new Label();
        topLabel.setAlignment(Label.CENTER);
        message = new Label();
        message.setAlignment(Label.CENTER);
        errorMessage = new Label();
        errorMessage.setAlignment(Label.CENTER);
        botLabel1 = new Label();
        botLabel1.setAlignment(Label.CENTER);
        botLabel2 = new Label();
        botLabel2.setAlignment(Label.CENTER);

        panel = new Panel();
        panel.setLayout(new FlowLayout());
        panel.setBackground(Color.white);


        myFrame.add(topLabel);
        myFrame.add(panel);
        myFrame.add(botLabel1);
        myFrame.add(botLabel2);
        myFrame.add(errorMessage);
        myFrame.add(message);

        myFrame.setVisible(true);

        topLabel.setText("Click on BROWSE button to select a file");
    }

    /**
     * This function checks the operating System type
     * @return  It returns the suitable path based on the Operating System
     */

    public static String checkOS(){
        String OS = System.getProperty("os.name").toLowerCase();
        if(OS.indexOf("win") >= 0){
            return "C:\\Users\\NAUSHAD\\Desktop\\";
        } else if(OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 ){
            return "/home/";
        } else if(OS.indexOf("mac") >= 0){
            return "/home/";
        } else
            return null;
    }


    //opens dialogue and shows file details in frame
    private void showFiles() {

        Button b = new Button("BROWSE");
        myFrame.add(b);
        panel.add(b);

        FileDialog fileDialogue = new FileDialog(myFrame);

        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fileDialogue.setVisible(true);

                //storing path of selected file in fileName
                String fileName = fileDialogue.getDirectory() + fileDialogue.getFile();
                store = fileName;

               // getting extension of selected file
                String extension = "";
                int i = fileName.lastIndexOf('.');
                if (i > 0) {
                    extension = fileName.substring(i+1);// to get part of string substring() is used
                }

                File file = new File(fileName);

                botLabel1.setText("You have selected the file " + fileDialogue.getFile()
                        + " from Directory :->    " + fileDialogue.getDirectory() );
                botLabel2.setText( "The length of file is "+ file.length() + "  Bytes"
                        + " ( " + (file.length()/1024) + " kB ) and the extension (type of file) is " + extension);


                errorMessage.setText("store is =  "+ getStore() );//  testing purpose

                //check for write protection
                if(file.canWrite()){
                    Path sourceFile = Paths.get(fileName);
                    Path targetFile = Paths.get(checkOS() + "copiedFile." + extension);//accepts sitable path from checkOS function

                    try {
                        Files.copy(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING);
                    } catch (IOException ex) {
                        message.setText("I/O Error when copying file. Check write protections.");
                    }


                }
              

            }
        });

    }

    public static String getStore() {
        return store;
    }

    //Main function -> to make the program work
    public static void main(String[] args) throws IOException {
        Main awt = new Main();
        awt.checkOS();  // boolean doubt. Should or not be called
        awt.showFiles();
        awt.split(awt.getStore());

    }



    public static void split(String fileName) throws IOException {
        
        RandomAccessFile raf = new RandomAccessFile(fileName, "r");
       
        long numSplits = 10; //from user input, extract it from args
        long sourceSize = raf.length();
        long bytesPerSplit = sourceSize / numSplits;
        long remainingBytes = sourceSize % numSplits;

        int maxReadBufferSize = 8 * 1024; //8KB
        for (int destIx = 1; destIx <= numSplits; destIx++) {
            BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(checkOS() + "split." + destIx));//getting path by checkos()
            if (bytesPerSplit > maxReadBufferSize) {
                long numReads = bytesPerSplit / maxReadBufferSize;
                long numRemainingRead = bytesPerSplit % maxReadBufferSize;
                for (int i = 0; i < numReads; i++) {
                    readWrite(raf, bw, maxReadBufferSize);
                }
                if (numRemainingRead > 0) {
                    readWrite(raf, bw, numRemainingRead);
                }
            } else {
                readWrite(raf, bw, bytesPerSplit);
            }
            bw.close();
        }
        if (remainingBytes > 0)

        {
            BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(checkOS() + "split." + (numSplits + 1)));
            readWrite(raf, bw, remainingBytes);
            bw.close();
        }
        raf.close();

    }
    public static void readWrite(RandomAccessFile raf, BufferedOutputStream bw, long numBytes) throws IOException {
        byte[] buf = new byte[(int) numBytes];
        int val = raf.read(buf);
        if (val != -1) {
            bw.write(buf);
        }
    }
}


Что я уже пробовал:

Я попытался сохранить значение fileName в поле store. а также использовал функцию для получения значения имени файла. Но я не могу им воспользоваться.

Richard MacCutchan

Вероятно, потому, что вы объявили split статическим, поэтому он не имеет доступа к переменным текущего объекта.

1 Ответов

Рейтинг:
1

Member 13730132

Вызов функции split из функции showfiles заставил ее работать


Patrice T

Если это решит вашу проблему, примите ваше решение, чтобы закрыть вопрос.