Java不兼容类型场景

Java不兼容类型场景,java,javasound,Java,Javasound,我正在学习Java,遇到了一个让我困惑的场景 下面是一些代码: long frameLength = stream.getFrameLength(); int frameSize = stream.getFormat().getFrameSize(); //total number of bytes = bytes per frame * total number of frames byte[] totalBytes = new byte[fram

我正在学习Java,遇到了一个让我困惑的场景

下面是一些代码:

     long frameLength = stream.getFrameLength(); 
     int frameSize = stream.getFormat().getFrameSize(); 


    //total number of bytes = bytes per frame * total number of frames

    byte[] totalBytes = new byte[frameLength * frameSize];
int类型不能接受stream.getFrameLength()的值,因为它太大。这就是我们使用long的原因

但是我们不能使用long,因为我们需要将(frameLength*frameSize)的值传递到byte[]holder中,该holder必须是int,因为java需要int大小的数组

因此,上述代码将不起作用

经过一些研究,我发现:

int frameLength = (int) stream.getFrameLength(); 
这似乎起作用了,我对添加的额外“(int)”部分感到困惑,这是什么,它意味着什么

上述内容与以下内容有何不同:

 int frameLength = stream.getFrameLength(); or
 long frameLength = stream.getFrameLength(); 
以下是工作代码:

AudioInputStream stream = AudioSystem.getAudioInputStream(f);
    int frameLength = (int) stream.getFrameLength(); //This is the number of bytes per frame in the audio stream
    int frameSize = (int) stream.getFormat().getFrameSize(); //Number of frames in the audio stream.

       //total number of bytes = bytes per frame * total number of frames

    byte[] totalBytes = new byte[frameLength * frameSize];
我很困惑,我希望能得到一些帮助

这似乎起作用了,我对添加的额外“(int)”部分感到困惑,这是什么,它意味着什么

它将
stream.getFrameLength()
中的任何内容强制转换为整数。请注意,如果它是一个大于
Integer.MAX\u值的long,您将得到一个

如果您确实需要字节数组的int初始化,我将首先执行乘法:

long frameLength = stream.getFrameLength();
int frameSize = stream.getFormat().getFrameSize();
然后查看是否不会出现整数溢出:

long length = frameSize * frameLength // its a long because that won't overflow as fast as int.
if (length > Integer.MAX_VALUE)
    throw new IllegalStateException("Frame too large. Integer overflow!")
else 
   byte[] totalBytes = new byte[frameLength * frameSize];

这假设不会发生溢出(因为我们不处理错误)。如果确实遇到这种情况,您应该找到另一种解决方案,而不是字节数组。

这称为强制转换。它会导致转换变窄。(这些是关键词。)通过在赋值运算符之后执行(int)可以将值解析为整数类型,-当然如果可能的话。由于
frameSize
的意思是
long
,因此我高度怀疑您在此处创建一个大小如此之大的字节数组是否正确。事实上,通过将long转换为int来缩小转换范围很容易导致应用程序生命周期中的错误。你打算用这个字节数组做什么?stream.read(totalBytes);读取音频输入流这是一个糟糕的想法;如果有人试图播放一个数千兆字节的音频文件呢。